import COS from 'cos-js-sdk-v5'
// 腾讯云存储
// https://bit-1310383539.cos.ap-chengdu.myqcloud.com
// https://bit-1310383539.cos-website.ap-chengdu.myqcloud.com
// https://bit-1310383539.cos.ap-chengdu.myqcloud.com/files%2F1666071890799-0.jpg

// SecretId: AKID1OXS9bonY4LOcicLxSmwtqgNtCLUVJyS
// SecretKey: JQNq7EBLhuvjOs9GC2gDYigQxJUTEpGW

const cos = new COS({
  // 腾讯云建议要获取临时密钥安全，但是为了方便直接写死
  SecretId: 'AKID1OXS9bonY4LOcicLxSmwtqgNtCLUVJyS',
  SecretKey: 'JQNq7EBLhuvjOs9GC2gDYigQxJUTEpGW'
});

let Bucket = cos.Bucket = 'bit-1310383539'
let Region = cos.Region = 'ap-chengdu'
let SourceURL = cos.SourceURL = 'bit-1310383539.cos.ap-chengdu.myqcloud.com/'


/**
 * 列出目录下所有文件，每次最多100条 
 * @param {*} Prefix 键的前缀，列出的object的key以Prefix开始，非必须
 * @param {*} fun
 * @returns 
 */
cos.myLs = function (Prefix, fun) {
  let files = []
  // 递归调用，直到 data.IsTruncated==='false'
  let funs = (Marker) => {
    cos.getBucket({ Bucket, Region, Prefix, Marker, MaxKeys: 1000 }, (err, data) => {
      if (err) return console.log('listFolder error:', err)
      else {
        files.push(...data.Contents)
        if (data.IsTruncated === 'true') funs(data.NextMarker)
        else return fun && fun(files);
      }
    })
  }
  funs()
}

/**
 * 多文件上传
 * @param {*} rawFiles 文件的 Key:文件路径和Body：file 的列表，如 [{Key:'123',Body:fileObject},{}]
 * @param {*} callback 
 * @param {*} uploadInfo 一个引用，函数会修其中的值，进度条实现
 */
cos.myUls = (rawFiles, callback, uploadInfo) => {
  if (!rawFiles.length) callback && callback() // 如果没文件，直接调回调
  let files = rawFiles.map((rawFile) => {
    return {
      ...rawFile, Bucket, Region,
      /* taskId可通过队列操作来取消上传cos.cancelTask(taskId)、停止上传cos.pauseTask(taskId)、重新开始上传cos.restartTask(taskId) */
      // onTaskReady: taskId => console.log(taskId) // 上传最开始执行
    }
  })
  cos.uploadFiles({
    files, SliceSize: 1024 * 1024 * 10,    /* 设置大于10MB采用分块上传 */
    onProgress: function (info) { // 传输过程中
      // loaded: 74456031 percent: 0.8 speed: 255003.89 total: 92679197
      var percent = parseInt(info.percent * 10000) / 100, speed = parseInt(info.speed / 1024 / 1024 * 100) / 100;
      // console.log(222, '进度：' + percent + '%; 速度：' + speed + 'Mb/s;');
      uploadInfo && (uploadInfo.value.percent = percent)
      uploadInfo && (uploadInfo.value.speed = speed)
    },
    onFileFinish: function (err, data, options) { // 单独文件传输完成
      // console.log(options.Key + '上传' + (err ? '失败' : '完成'));
    },
  }, function (err, data) { // 所有文件传输完毕后的
    callback && callback(err || data)
  })
}



/**
 * 删除单个文件
 * @param {*} Key 文件的key
 * @param {*} fun 
 */
cos.myRm = (Key, fun) => {
  cos.deleteObject({ Bucket, Region, Key },
    (err, data) => fun && fun(err || data)
  )
}

/**
 * 删除多个文件
 * @param {*} keys 键的字符串列表，形如['1.jpg','2.txt', ...]
 * @param {*} callback 执行一次，删除完全部后执行
 * @param {*} fun 每删除一个文件就执行一次
 * @returns 
 */
cos.myRms = (keys, callback, fun) => {
  if (!keys.length) callback && callback() // 如果没文件，直接调回调
  // 这个API有问题，用不了，看看以后能不能解决
  // 这里直接批量调 myRm
  let count = 0
  for (const key of keys) cos.myRm(key, res => {
    count++
    fun && fun(res)
    if (count == keys.length) callback && callback()
  })
  return;

  cos.deleteMultipleObject({
    Bucket: 'bit-1310383539', /* 填入您自己的存储桶，必须字段 */
    Region: 'ap-chengdu',  /* 存储桶所在地域，例如ap-beijing，必须字段 */
    Objects: [
      { Key: '1.jpg' }, /* 存储在桶里的对象键（例如1.jpg，a/b/test.txt），必须字段 */
      { Key: '2.txt' }, /* 存储在桶里的对象键（例如1.jpg，a/b/test.txt），必须字段 */
    ]
  }, function (err, data) {
    console.log(err || data);
  });
}

/**
 * 复制单个，参数示例 ('note-imgs/1680885621096-0.jpg', 'recycle/', a => console.log(a))
 * @param {*} sourceKey 源文件的key
 * @param {*} target 目标文件夹，记得加 /
 * @param {*} callback 
 * @param {*} func 进度回调函数，传入一个进度对象 progressData
 */
cos.myCp = (sourceKey, target, callback, func) => {
  let filename = sourceKey.split('/').at(-1)

  cos.sliceCopyFile({
    Bucket, Region, Key: target + filename,
    CopySource: SourceURL + sourceKey, // 要写全
    onProgress: progressData => func && func(progressData) // 进度回调函数，回调参数为进度对象 progressData
  }, (err, data) =>
    callback && callback(err || data)
  )
}

/**
 * 移动单个：先复制后删除
 * 示例 ('note-imgs/1680885621096-0.jpg', 'recycle/', a => console.log(a))
 * @param {*} sourceKey 源文件的key
 * @param {*} target 目标文件夹，记得加 /
 * @param {*} callback 
 * @param {*} func 进度回调函数，传入一个进度对象 progressData
 */
cos.myMv = (sourceKey, target, callback, func) => {
  let filename = sourceKey.split('/').at(-1)

  cos.sliceCopyFile({
    Bucket, Region, Key: target + filename, CopySource: SourceURL + sourceKey, // 要写全
    onProgress: progressData => func && func(progressData)
  }, (err, data) => {
    if (err) return console.log(err)
    cos.deleteObject({ Bucket, Region, Key: sourceKey }, (err, data) => {
      callback && callback(err || data)
    })
  })
}


export default cos;